package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"time"
)

func main() {
	serverHandleFunc()
}

func init() {
	log.SetFlags(log.Ldate | log.Lmicroseconds | log.Llongfile)
	log.SetPrefix("[FATAL]")
}

func serverHandleFunc() {
	// 使用 HandelFunc 则比较简洁，handle 方法可以直接注入匿名函数(该函数类型为 HandleFunc)去处理请求
	// Handler 和 HandlerFunc 都是通过 DefaultServeMux 来实现的。DefaultServeMux 才是上面服务的核心
	// 而实际上 http.ListenAndServe 的第二个参数的类型是 Handler，也是支持注册处理请求的 Handler 实现类的
	http.HandleFunc("/index", func(writer http.ResponseWriter, request *http.Request) {
		//time.Sleep(time.Second * 5)
		_, err := writer.Write([]byte("或我知一天必找着爱"))
		if err != nil {
			log.Fatal(err)
		}
	})
	err := http.ListenAndServe("127.0.0.1:8888", nil)
	if err != nil {
		log.Fatal()
	}
}

func defaultServer() {
	//  设置访问路径 /index，在这种方式下，需要为每个请求都定义一个 Handel，然后 Handle 需要实现 ServeHTTP 接口
	//  Handel 是一个请求处理器，我们如果使用这种方式，就需要为每一个请求的 url 实现一个 Handel
	http.Handle("/index", &CustomerHandler{})
	//  监听端口 8888
	err := http.ListenAndServe("127.0.0.1:8888", nil)
	if err != nil {
		log.Fatal()
	}
}

type CustomerHandler struct {
}

func (c *CustomerHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
	defer request.Body.Close()
	fmt.Println("implement http server by self")
	time.Sleep(2 * time.Second)
	switch request.Header.Get("content-type") {
	case "application/x-www-form-urlencoded":
		err := request.ParseForm()
		if err != nil {
			log.Fatal(err)
		}
		fmt.Printf("%+v\n", request.PostForm)
	default:
		fmt.Println(request.Header)
		readAll, err := ioutil.ReadAll(request.Body)
		if err != nil {
			log.Fatal(err)
		}
		fmt.Printf("%+v\n", string(readAll))
	}
	write, err := writer.Write([]byte("server echo"))
	if err != nil || write == 0 {
		fmt.Println("response err")
	}
}
